/**
 * @description 用户控制层，用来书写处理逻辑
 * @author 宫彦胜
 */

const { getUserInfo, createUser, deleteUser } = require('../service/user')
const { SuccessModel, ErrorModel } = require('../model/ResModel')
const { 
  registerUserNameExistInfo, // 用户名已经存在
  registerUserNameNotExistInfo, // 用户名不存在
  registerFialInfo, // 注册用户信息失败
  loginFailInfo, // 用户登录失败逻辑
  deleteUserFailInfo, // 删除用户失败
  
} = require('../model/ErrorInfo')
const doCrypto = require('../util/cryp')


/**
 * @description 通过用户名查询是否存在
 */
async function isExist(userName){
  // 调用 service 进行处理
  const userInfo = await getUserInfo(userName)
  if(userInfo){
    return new SuccessModel(userInfo)
  }else{
    return new ErrorModel(registerUserNameNotExistInfo)
  }
}

/**
 * @description 注册用户信息
 */
async function register({ userName, password, gender }){
  //通过用户名查看是否已经存在
  const userInfo = await getUserInfo(userName)
  if(userInfo){
    // 如果存在就返回一个错误的失败信息
    return new ErrorModel(registerUserNameExistInfo)
  }
  try{
    await createUser({ 
      userName, 
      password: doCrypto(password), 
      gender 
    })
    return new SuccessModel()
  }catch(err){
    console.error(err)
    return new ErrorModel(registerFialInfo)
  }
}

/**
 * 
 * @param {object} ctx ctx 对象
 * @param {string} userName 用户名
 * @param {string} password 密码
 */
async function login(ctx,userName,password){
  
  const userInfo = await getUserInfo(userName,doCrypto(password))
  if(!userInfo){
    return new ErrorModel(loginFailInfo)
  }
  // 向userInfo 中存储一份
  if(!ctx.session.userInfo){
    ctx.session.userInfo = userInfo
  }
  return new SuccessModel
  
}

/**
 * 删除当前用户
 * @param {string} userName 
 */
async function deleteCurUser(userName){
  const res = await deleteUser(userName)
  if(res){
    return new SuccessModel()
  }else{
    return new ErrorModel(deleteUserFailInfo)
  }
}


module.exports = {
  isExist,
  register,
  login,
  deleteCurUser
}